'use strict';

// node 7.70+, 原生支持 async / await
// 每个任务用一定时间后完成
// stage1 : 并行2个任务 (#!, #2)
// 都结束后, 执行 #3
// stage2 : #3 结束后，并行执行若干任务，但是并行度为2
// stage2 所有任务完成后, 结束

const libAsync = require('async');
let gJobId = 1;
let baseTime = 1000;
let deltaTime = 1000;

function timeCostingJob(cb) {
  let id = gJobId++;
  let time = Math.floor(Math.random() * deltaTime + baseTime);
  setTimeout(() => {
    console.log(`timeCostingJob callback, id=${id}, time=${time}`)
    cb && cb(null, id);
  }, time)
}

function createJob(jobSize) {
  let jobs = [];
  for (let i = 0; i < jobSize; i++) {
    jobs.push(timeCostingJob)
  }
  return jobs;
}


function jobDone(err, id) {
  if (err) return console.log(err);
  console.log(`jobDone, id=${id}`)
}


function stage1(cb) {
  console.log('stage 1 : start');
  libAsync.parallel(
    createJob(2),
    function(err, results) {
      console.log('stage 1 : done');
      console.log('stage 1 : result, ', results);
      cb && cb('stage 1 : cb');
    });
}


function stage2(cb) {
  console.log('stage 2 : start');
  libAsync.parallelLimit(
    createJob(7),
    2,
    function(err, results) {
      console.log('stage 2 : done');
      console.log('stage 2 : result, ', results);
      cb && cb('stage 2 : cb');
    });
}

let foo = stage1.bind(null,stage2.bind(null,console.log));
foo();